#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/msg.h>



#define PATH_NAME       "./msg_11"
#define CMD_LEN            1024

typedef struct _msg_type_
{
    int message_type;
    char command[CMD_LEN];
}MSG_TYPE;







int msg_recv_thread()
{
    int msg_id;
    MSG_TYPE msg_recv = {0};

    key_t key = ftok(PATH_NAME,1234);

    msg_id = msgget(key, IPC_CREAT|0666);
    
    while(1)
    {
        msg_rcv( msg_id, &msg_recv, 0, IPC_NOWAIT);

        printf("Recv MSG ++[%s]\n",msg_recv.command);

        sleep(1);
    }
}


int msg_snd(int msg_id,MSG_TYPE * msg,int flag)
{    
    msgsnd(msg_id, msg, sizeof(msg->command), flag);
    
    if (-1 == errno)
    {
        perror("msgsnd");
    }
}



int msg_rcv(int msg_id,MSG_TYPE * msg,int tpye,int flag)
{
    int rcv_len;
    
    rcv_len = msgrcv( msg_id, msg, sizeof(msg->command), tpye, flag);

    if (-1 == errno)
    {
        perror("msgsnd");
    }
}


int msg_IPC_RMID(int msg_id)
{
    msgctl(msg_id, IPC_RMID, NULL);
}

void main()
{
    int i = 0;
    int msg_id ;

    int rcv_len;
    
    errno = 0;


    MSG_TYPE msg = {0};
    MSG_TYPE msg_recv = {0};
    
    msg.message_type = 0x0001;
    msg_recv.message_type = 0x0001;
    
    key_t key = ftok(PATH_NAME,1234);

    msg_id = msgget(key, IPC_CREAT|0666);


    pthread_t tid;
    
    pthread_create(&tid,NULL,msg_recv_thread,NULL);

    while(1)
    {
        if(i>10)
        {
            break;
        }

        sprintf(msg.command,"[%d] __MSG__TEST__",i);

        msg_snd(msg_id, &msg, IPC_NOWAIT);

        //rcv_len = msg_rcv( msg_id, &msg_recv, 0, IPC_NOWAIT);

        //printf("Recv MSG ++[%s]\n",msg_recv.command);

        i++;
        sleep(1);
    }

    msg_IPC_RMID(msg_id);
    
    return;
}


